home *** CD-ROM | disk | FTP | other *** search
/ ADA Programming Guide / ADA Programming Guide.iso / ada_pcdp / ada / matrixo.ada < prev    next >
Text File  |  1996-01-30  |  3KB  |  130 lines

  1. procedure MatrixO is
  2.  
  3.   type Task_Types is (Multiplier, Source, Sink, Zero, Result);
  4.  
  5.   Size: constant Integer := 3;
  6.   type Vector is array(1..Size) of Integer;
  7.   Matrix1: array(1..Size) of Vector := 
  8.     ((1,2,3),(4,5,6),(7,8,9));
  9.   Matrix2: array(1..Size) of Vector :=
  10.     ((1,0,2),(0,1,2),(1,0,0));
  11.  
  12.   type Channels is range 1..2*Size*(Size+1)+1;
  13.   type Tasks(Task_Type: Task_Types);
  14.   type Task_Ptr is access Tasks;
  15.  
  16.   task type Multiplier_Task is
  17.     entry Init(Coeff: Integer; T: Task_Ptr);
  18.     entry Input (Channels)(I: in  Integer);
  19.   end Multiplier_Task;
  20.  
  21.   task type Source_Task is
  22.     entry Init(V: Vector; T: Task_Ptr);
  23.   end Source_Task;
  24.  
  25.   task type Sink_Task is
  26.     entry Init(T: Task_Ptr);
  27.     entry Input (Channels)(I: in  Integer);
  28.   end Sink_Task;
  29.  
  30.   task type Zero_Task is
  31.     entry Init(T: Task_Ptr);
  32.   end Zero_Task;
  33.  
  34.   task type Result_Task is
  35.     entry Init(ID: Integer; T: Task_Ptr);
  36.     entry Input (Channels)(I: in  Integer);
  37.   end Result_Task;
  38.  
  39.   type Tasks(Task_Type: Task_Types) is
  40.     record
  41.       North, East, South, West: Channels;
  42.       case Task_Type is
  43.         when Multiplier => M: Multiplier_Task;
  44.         when Source     => S: Source_Task;
  45.         when Sink       => T: Sink_Task;
  46.         when Zero       => Z: Zero_Task;
  47.         when Result     => R: Result_Task;
  48.       end case;
  49.     end record;
  50.  
  51.   task type Channel_Task is
  52.     entry Destination(T_Ptr: Task_Ptr; Chan: Channels);
  53.     entry Output(I: in Integer);
  54.   end Channel_Task;
  55.  
  56.   M: array(1..Size, 1..Size) of Task_Ptr;
  57.   S: array(1..Size) of Task_Ptr;
  58.   T: array(1..Size) of Task_Ptr;
  59.   Z: array(1..Size) of Task_Ptr;
  60.   R: array(1..Size) of Task_Ptr;
  61.  
  62.   Channel: array(Channels range 1..Channels'Last-1) of Channel_Task;
  63.  
  64.   task body Multiplier_Task is separate;
  65.   task body Source_Task     is separate;
  66.   task body Sink_Task       is separate;
  67.   task body Zero_Task       is separate;
  68.   task body Result_Task     is separate;
  69.   task body Channel_Task    is separate;
  70.  
  71.   procedure Activate is
  72.   begin
  73.     M := (others => (others => new Tasks(Multiplier)));
  74.     S := (others => new Tasks(Source));
  75.     T := (others => new Tasks(Sink));
  76.     Z := (others => new Tasks(Zero));
  77.     R := (others => new Tasks(Result));
  78.   end Activate;
  79.  
  80.   procedure Configure is               
  81.     N: Channels;
  82.   begin
  83.     N := 1;
  84.     for I in 1..Size loop
  85.       S(I).South := N;
  86.       M(1,I).North := N;
  87.       N := N + 1;
  88.       Z(I).West := N;
  89.       M(I,Size).East := N;
  90.       N := N + 1;
  91.       T(I).North := N;
  92.       M(Size,I).South := N;
  93.       N := N + 1;
  94.       R(I).East := N;
  95.       M(I,1).West := N;
  96.       N := N + 1;
  97.       for J in 2..Size loop
  98.         M(I,J).West := N;
  99.         M(I,J-1).East := N;
  100.         N := N + 1;
  101.       end loop;
  102.       if I /= Size then
  103.         for J in 1..Size loop
  104.           M(I,J).South := N;
  105.           M(I+1,J).North := N;
  106.           N := N + 1;
  107.         end loop;
  108.       end if;
  109.     end loop;
  110.   end Configure;
  111.  
  112.   procedure Init is
  113.   begin
  114.     for I in 1..Size loop
  115.       R(I).R.Init(I, R(I));
  116.       S(I).S.Init(Matrix2(I), S(I));
  117.       T(I).T.Init(T(I));
  118.       Z(I).Z.Init(Z(I));
  119.       for J in 1..Size loop
  120.         M(I,J).M.Init(Matrix1(I)(J), M(I,J));
  121.       end loop;
  122.     end loop;
  123.   end Init;
  124.  
  125. begin
  126.   Activate;
  127.   Configure;
  128.   Init;
  129. end MatrixO;
  130.